package DataStructures.Recursion;

public class MiGong {
    public static void main(String[] args) {
        //先创建一个二维数组模拟迷宫
        //地图
        int[][] map = new int[8][7];
        //使用1表示墙(不能通过)
        //先把上下全部置为1 模拟外层墙壁
        for (int i = 0 ; i < 7 ; i++) {
            map[0][i] = 1;
            map[7][i] = 1;
        }
        //再把左右全部置为1
        for (int i = 0 ; i < 8 ; i ++) {
            map[i][0] = 1;
            map[i][6] = 1;
        }
        //设置挡板 也用1表示
        map[3][1] = 1;
        map[3][2] = 1;

        //输出地图
        System.out.println("地图的情况:");
        for (int i = 0 ; i < 8 ; i++) {
            for (int j = 0 ; j < 7 ; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }

        //使用递归回溯给小球找路
        //map是引用类型 所以共享
        setWay(map,1,1);

        //输出新的地图 小球走过 并标识过的地图
        System.out.println("走过的地图的情况:");
        for (int i = 0 ; i < 8 ; i++) {
            for (int j = 0 ; j < 7 ; j++) {
                System.out.print(map[i][j] + " ");
            }
            System.out.println();
        }
    }

    /**
     *
     * @param map 表示地图
     * @param i 从哪个位置开始找
     * @param j
     * @return 如果找到通路 就返回true 否则返回false
     */
    //使用递归回溯来给小球找路
    //1.map表示地图
    //2. i j 表示从地图的哪个位置开始出发 比如(1,1)
    //3.如果小球能到map[6][5]位置 则说明通路找到
    //4.约定:map[i][j] 为 0 表示该点没有走过 当为 1 时表示墙 当 2 时表示通路可以走 当 3 表示该点已经走过 但是走不通
    //5.在走迷宫时需要确定一个策略(方法) 我们定义:下->右->上->左 如果该点走不通 再回溯
    public static boolean setWay(int[][] map,int i,int j) {
        if (map[6][5] == 2) {//通路已经找到 OK了 总的判断迷宫的出口 我们规定这个点是迷宫的出口
            return true;
        }else {
            if (map[i][j] == 0) {//如果当前这个点还没有走过
                //按照策略走 下->右->上->左 走
                //走之前我们假定这条路是通的 也即将该点设置为2
                map[i][j] = 2;
                if (setWay(map,i + 1,j)) {//向下走
                    return true; //条件语句里的返回是在找到通路后一层一层返回true
                }else if (setWay(map,i,j + 1)) {//向右走
                    return true;
                }else if (setWay(map,i - 1,j)) {//向上走
                    return true;
                }else if (setWay(map,i,j - 1)){//向左走
                    return true;
                }else {
                    //上下左右都走不通 说明该点是走不通的 是死路
                    map[i][j] = 3;
                    return false;
                }
            }else {//如果map[i][j]不等于0 可能是 1 2 3
                return false;
            }
        }
    }
}
